package com.collabscm.md.base.web;

import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import com.collabscm.md.base.model.User;
import com.collabscm.md.base.service.UserService;
import com.collabscm.pf.web.BaseAction;

@Results(
//Struts的 Result配置，可以省略struts.xml的配置。
{
		@Result(name = LoginAction.ADMIN, location = "/login/admin.jsp"),//系统管理员页面
		@Result(name = LoginAction.OPERATE, location = "/login/operate.jsp"),//系统操作员页面
		@Result(name = LoginAction.FAILURE, location = "index.jsp"),//失败转回页面
		@Result(name = LoginAction.ADMIN_LEFT, location = "/login/adminLeft.jsp"),//系统管理员左边页面
		@Result(name = LoginAction.ADMIN_RIGHT, location = "/login/adminRight.jsp"),//系统管理员右边页面
		@Result(name = LoginAction.OPERATE_FRAMESET, location = "/login/operateFrameset.jsp"),//系统操作员主界面Frameset页面
		@Result(name = LoginAction.OPERATE_LEFT, location = "/login/operateLeft.jsp"),//系统操作员主界面左边页面
		@Result(name = LoginAction.OPERATE_RIGHT, location = "/login/operateRight.jsp"),//系统操作员主界面右边页面
		@Result(name = LoginAction.OPERATE_HIDDEN, location = "/login/operateHidden.jsp")//系统操作员主界面隐藏页面
})
public class LoginAction extends BaseAction {

	private static final long serialVersionUID = 1L;

	/**
	 * 返回系统管理员页面
	 */
	private static final String ADMIN = "admin";

	/**
	 * 返回系统操作员页面
	 */
	private static final String OPERATE = "operate";

	/**
	 * 返回失败转回页面
	 */
	private static final String FAILURE = "failure";

	/**
	 * 返回系统管理员左边页面
	 */
	private static final String ADMIN_LEFT = "adminLeft";

	/**
	 * 返回系统管理员右边页面
	 */
	private static final String ADMIN_RIGHT = "adminRight";

	/**
	 * 返回系统操作员左边页面
	 */
	private static final String OPERATE_LEFT = "operateLeft";

	/**
	 * 返回系统操作员右边页面
	 */
	private static final String OPERATE_RIGHT = "operateRight";

	/**
	 * 系统操作员主界面Frameset页面
	 */
	private static final String OPERATE_FRAMESET = "operateFrameset";

	/**
	 * 系统操作员主界面隐藏页面
	 */
	private static final String OPERATE_HIDDEN = "operateHidden";
	
	/**
	 * 用户帐号
	 */
	private String userCode;

	/**
	 * 密码
	 */
	private String password;

	public String login() throws Exception {
		logDebug("Cureent userCode = {}", userCode);
		logDebug("Cureent password = {}", password);
		// FIXME 不能根据userCode和password直接到数据库中取对象，因为数据库中的加密后的密码，而用户送过来的是
		// 未加密的密码，具体的步骤应该是，下面的内容是在Service中实现的不是在Action中实现：
		// 1、根据userCode从数据库中取出用户的密码（仅密码即可，不需要取其他的东东）；
		// 2、调用pf下的Cryptography对象的martchCiphertext，将用户输入的密码和数据库中取得的密码送过去，然后进行加密校验；
		// 3、设置UserInfo到用户缓存中，因为我们不需要进行Cluster的处理，而是前面使用LoadBalance，后面有多个AppServer，然后有一个或多个Session服务器（即：SSO），这个我还未完全考虑明白。
		User user = getService(UserService.class).getUserByNoAndPW(userCode,
				password);
		logDebug("Find {}", user);
		if (user == null) {
			return FAILURE;
		} else if (new Long(5001).equals(user.getUserCategory())) {
			return ADMIN;
		} else if (new Long(5002).equals(user.getUserCategory())) {
			return OPERATE;
		}
		// TODO 常量
		// else if
		// (CommonConstants.CATEGORY_ADMIN.equals(user.getUserCategory())) {
		// return "admin";
		// } else if
		// (CommonConstants.CATEGORY_OPERATE.equals(user.getUserCategory())) {
		// return "operate";
		// }
		return SUCCESS;
	}

	/**
	 * 系统管理员左边跳转
	 * 
	 * @return
	 * @throws Exception
	 */
	public String adminLeft() throws Exception {
		return ADMIN_LEFT;
	}

	/**
	 * 系统管理员右边跳转
	 * 
	 * @return
	 * @throws Exception
	 */
	public String adminRight() throws Exception {
		return ADMIN_RIGHT;
	}

	/**
	 * 系统操作员左边跳转
	 * 
	 * @return
	 * @throws Exception
	 */
	public String operateLeft() throws Exception {
		return OPERATE_LEFT;
	}

	/**
	 * 系统操作员右边跳转
	 * 
	 * @return
	 * @throws Exception
	 */
	public String operateRight() throws Exception {
		return OPERATE_RIGHT;
	}
	
	/**
	 * 系统操作员主界面Frameset跳转
	 * 
	 * @return
	 * @throws Exception
	 */
	public String operateFrameset() throws Exception {
		return OPERATE_FRAMESET;
	}

	/**
	 * 系统操作员主界面隐藏跳转
	 * 
	 * @return
	 * @throws Exception
	 */
	public String operateHidden() throws Exception {
		System.out.println("HHHHHHHHHHHHHHHHHHHHHHHHHHHHH");
		return OPERATE_HIDDEN;
	}

	public String getUserCode() {
		return userCode;
	}

	public void setUserCode(String userCode) {
		this.userCode = userCode;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}
